package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import negocio.Plato;
import persistencia.AdministradorDeConexion;

public class DAOPlato {
	
	private static DAOPlato instancia;
	
	private DAOPlato(){
			
	}
	
	public static DAOPlato getInstancia() {
		if(instancia == null)
			return instancia = new DAOPlato();
		return instancia;
	}
	
	//*******************************************************************************************************************//
	// ALTA
	//*******************************************************************************************************************//	
	public void crearPlato(Plato Plato){
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		try{
			String query =  "INSERT INTO Plato "
			+ "(NroPlato, Nombre, Minutos, Precio) "
			+ "VALUES (?,?,?,?)";	    
			PreparedStatement preparedStatement = null;
			preparedStatement = connection.prepareStatement(query);
			preparedStatement.setInt(1, Plato.getNroPlato());
			preparedStatement.setString(2, Plato.getNombre());
			preparedStatement.setInt(3, Plato.getMinutos());
			preparedStatement.setFloat(4, Plato.getPrecio());
			preparedStatement.execute();			
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Info: DAOPlato.crearPlato(): El Plato " + Plato.getNombre() + " se ha cargado exitosamente en la Base de Datos.");
		}
		catch (SQLException e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOPlato.crearPlato(): Error al intentar crear el Plato " + Plato.getNombre() + " en la Base de Datos. " + e.getLocalizedMessage());
		}
		catch (Exception e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOPlato.crearPlato(): Error al intentar crear el Plato " + Plato.getNombre() + " en la Base de Datos. " + e.getLocalizedMessage());
		}
	}
	//*******************************************************************************************************************//
	// MODIFICACION
	//*******************************************************************************************************************//	
	public void actualizarPlato(Plato Plato){
		
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		try{
			String query =  "UPDATE Plato SET " +
			"NroPlato = ?, Nombre = ?, Minutos = ?, Precio = ? " +
			"WHERE nombre = ?";
			PreparedStatement preparedStatement = null;
			preparedStatement = connection.prepareStatement(query);
			preparedStatement.setInt(1, Plato.getNroPlato());
			preparedStatement.setString(2, Plato.getNombre());
			preparedStatement.setInt(3, Plato.getMinutos());
			preparedStatement.setFloat(4, Plato.getPrecio());
			preparedStatement.execute();			
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Info: DAOPlato.actualizarPlato(): El Plato " + Plato.getNombre() + " se ha actualizado exitosamente en la Base de Datos.");
		}
		catch (SQLException e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOPlato.actualizarPlato(): Error al intentar actualizar el Plato " + Plato.getNombre() + " en la Base de Datos. " + e.getLocalizedMessage());
		}
		catch (Exception e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOPlato.actualizarPlato(): Error al intentar actualizar el Plato " + Plato.getNombre() + " en la Base de Datos. " + e.getLocalizedMessage());
		}
	}	
	//*******************************************************************************************************************//
	// BUSQUEDA
	//*******************************************************************************************************************//
	public Plato buscarPlato(int nroPlato) {
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		Plato Plato = null;
		try{
			String query =  "SELECT * FROM Plato WHERE NroPlato = ?";
			PreparedStatement preparedStatement = null;
			preparedStatement = connection.prepareStatement(query);
			preparedStatement.setInt(1, nroPlato);
			ResultSet result = preparedStatement.executeQuery();			
			while (result.next()){
				
				// Constructor Plato:
				// String nombre, String tipoPlato, Receta receta, Seccion seccion, float precio
				
				Plato = new Plato(
								 result.getInt("NroPlato"),
								 result.getString("Nombre"),
								 result.getInt("Minutos"),
								 result.getFloat("Precio"));
				
				AdministradorDeConexion.getInstancia().closeConnection(connection);
				return Plato;
			}
		}
		catch (SQLException e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOPlato.buscarPlato(): Error al buscar la Plato " + nroPlato + " en la Base de Datos. " + e.getLocalizedMessage());
		}
		catch (Exception e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOPlato.buscarPlato(): Error al buscar la Plato " + nroPlato + " en la Base de Datos. " + e.getLocalizedMessage());
		}
		return null;
	}
	public Vector<Plato> buscarTodasLasPlatos() {
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		Vector<Plato> vPlatos = null;
		try{
			String query =  "SELECT * FROM Plato";
			PreparedStatement preparedStatement = null;
			preparedStatement = connection.prepareStatement(query);
			ResultSet result = preparedStatement.executeQuery();			
			vPlatos = new Vector<Plato>();
			while (result.next()){
				
				// Constructor Plato:
				// String nombre, String tipoPlato, Receta receta, Seccion seccion, float precio
				
				Plato Plato = new Plato(
								 result.getInt("NroPlato"),
								 result.getString("Nombre"),
								 result.getInt("Minutos"),
								 result.getFloat("Precio"));
				
				// Agrego el Plato dado de alta al vector de Platos.
				
				vPlatos.add(Plato);
			}
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			return vPlatos;
		}
		catch (SQLException e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOPlato.buscarTodasLasPlatos(): Error al buscar todos los Platos en la Base de Datos. " + e.getLocalizedMessage());
		}
		catch (Exception e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOPlato.buscarTodasLasPlatos(): Error al buscar todos los Platos en la Base de Datos. " + e.getLocalizedMessage());
		}
		return null;
	}
	public Vector<String> getListaDeTodasLasPlatos() {
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		Vector<String> vListaDePlatos = null;
		try{
			String query =  "SELECT * FROM Plato";
			PreparedStatement preparedStatement = null;
			preparedStatement = connection.prepareStatement(query);
			ResultSet result = preparedStatement.executeQuery();
			vListaDePlatos = new Vector<String>();
			while (result.next()){
			// Agrego el Plato dado de alta al vector de Platos.
				vListaDePlatos.add(result.getString("Nombre"));
			}
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			return vListaDePlatos;
		}
		catch (SQLException e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOPlato.getListaDeTodasLasPlatos(): Error al buscar la lista de todos los Platos en la Base de Datos. " + e.getLocalizedMessage());
		}
		catch (Exception e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOPlato.getListaDeTodasLasPlatos(): Error al buscar la lista de todos los Platos en la Base de Datos. " + e.getLocalizedMessage());
		}
		return null;
	}
	public Vector<String> getListaPlatosByTipo(String type){
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		Vector<String> vListaDePlatos = null;
		try{
			String query =  "SELECT * FROM Plato where TipoPlato = " + type;
			PreparedStatement preparedStatement = null;
			preparedStatement = connection.prepareStatement(query);
			ResultSet result = preparedStatement.executeQuery();
			vListaDePlatos = new Vector<String>();
			while (result.next()){
			// Agrego el Plato dado de alta al vector de Platos.
				vListaDePlatos.add(result.getString("Nombre"));
			}
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			return vListaDePlatos;
		}
		catch (SQLException e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOPlato.getListaDeTodasLasPlatos(): Error al buscar la lista de todos los Platos en la Base de Datos. " + e.getLocalizedMessage());
			return null;
		}
	}
}
